CloudFormation으로 CloudFront OAI 설정 해보기
안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 CloudFormation으로 CloudFront OAI를 설정해 보는 과정을 정리해 봤습니다.
파라미터 설정
AWSTemplateFormatVersion: "2010-09-09" Description: CloudFront OAI Setting Metadata: "AWS::CloudFormation::Interface": ParameterGroups: - Label: default: "S3, ACM Setting" Parameters: - BucketName - ACMSSL ParameterLabels: BucketName: default: "Enter the name of the S3 bucket" ACMSSL: default: "Enter ACM SSL" # ------------------------------------------------------------# # Parameters # ------------------------------------------------------------# Parameters: BucketName: Type: String Default: "S3 Bucket Name" ACMSSL: Type: String Default: "ACM Identifier"
S3 버킷을 생성하고, CloudFront에서 SSL을 설정해야 하기 때문에 버킷 이름과 ACM의 Identifier를 입력 받습니다.
버킷 생성과 정책 설정
Resources: # ------------------------------------------------------------# # S3 Bucket # ------------------------------------------------------------# # Bucket Bucket: Type: "AWS::S3::Bucket" Properties: BucketName: !Ref BucketName AccessControl: Private BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true BucketPolicy: Type: "AWS::S3::BucketPolicy" Properties: Bucket: !Ref Bucket PolicyDocument: Statement: - Action: "s3:GetObject" Effect: Allow Resource: !Sub "arn:aws:s3:::${Bucket}/*" Principal: CanonicalUser: !GetAtt CloudFrontOriginAccessIdentity.S3CanonicalUserId
S3 버킷을 생성하고, CloudFront에서만 접근이 가능하도록 버킷 정책을 업데이트 합니다.
CloudFront 생성과 OAI 설정
# ------------------------------------------------------------# # CloudFront # ------------------------------------------------------------# CloudFrontOriginAccessIdentity: Type: "AWS::CloudFront::CloudFrontOriginAccessIdentity" Properties: CloudFrontOriginAccessIdentityConfig: Comment: !Sub "access-identity-${Bucket}" CloudFrontDistribution: Type: "AWS::CloudFront::Distribution" Properties: DistributionConfig: Origins: - DomainName: !GetAtt Bucket.RegionalDomainName Id: !Sub "S3origin-${BucketName}" S3OriginConfig: OriginAccessIdentity: !Sub "origin-access-identity/cloudfront/${CloudFrontOriginAccessIdentity}" DefaultCacheBehavior: TargetOriginId: !Sub "S3origin-${BucketName}" ViewerProtocolPolicy: allow-all AllowedMethods: - GET - HEAD Compress: true ForwardedValues: Cookies: Forward: none QueryString: false ViewerCertificate: SslSupportMethod: sni-only MinimumProtocolVersion: TLSv1.2_2021 AcmCertificateArn: !Sub "arn:aws:acm:us-east-1:${AWS::AccountId}:certificate/${ACMSSL}" HttpVersion: http2 Enabled: true
「CloudFrontOriginAccessIdentity」로 새 원본 액세스 ID(OAI)를 생성합니다. 이어서 CloudFrontDistribution으로 CloudFront를 생성하면서, OriginAccessIdentity에 생성한 OAI를 설정합니다. OAI는 Amazon S3 오리진과 연결할 수 있는 특별한 CloudFront 사용자이며, Amazon S3 콘텐츠의 전체 또는 일부를 보호할 수 있습니다
결과 확인
CloudFront로 들어가서 확인해 보면, 설정한 보안 정책과 SSL이 설정되어 있는 것을 확인할 수 있습니다.
OAI 또 한 정상적으로 설정되어 있습니다.
S3 버킷 정책 또 한 잘 설정되어 있는 것을 확인할 수 있습니다.
S3 버킷에 이미지를 업로드 하고 S3에서 접근해 보면 다음과 같이 AccessDenied 에러가 나옵니다.
- dw790skvg56mc.cloudfront.net
이제 CloudFront 도메인으로 접속해 보도록 하겠습니다. (CloudFront는 블로그 생성 후 삭제 됩니다.)
CloudFront 도메인으로 접속해 보면 S3 버킷에 업로드한 이미지가 문제없이 출력되는 것을 볼 수 있습니다.